#include "../include/fd.h"
#include "../include/kernel.h"
#include "../include/defs.h"

extern fileDescriptorManager FDM;

/**
 * Inicializa FDM
 * */
void
initFDM(void)
{
    int i;

    FDM.cant = 0;

    for (i=0; i < FD_MAX; i++)
        FDM.fds[i].open = FALSE;

    return;
}

/**
 * fdNew crea un nuevo fd y devuelve su número.
 */
int fdNew( int (*init)(void), size_t (*setByte)(int b),
         size_t (*getByte)(int *b))
{
    int i = 0;

    if (FDM.cant == FD_MAX)
        return -1;

    /*Busco en qué lugar poner el nuevo.*/
    while (FDM.fds[i].open)
    {
        i++;
    }

    /*Creo el nuevo con los parámetros que me pasaron.*/
    FDM.cant++;
    FDM.fds[i].init = init;
    FDM.fds[i].setByte = setByte;
    FDM.fds[i].getByte = getByte;
    FDM.fds[i].open = TRUE;

    /*Utilizo la función de inicialización del fd*/
    if (init != NULL)
        FDM.fds[i].init();

    return i;
}

/**
 * fdopen abre el fd y devuelve su puntero.
 */
fdType *fdopen(int fd, const char *mode)
{
    if (fd < 0 || fd > FD_MAX || mode == NULL)
        return NULL;

    if (FDM.fds[fd].open)
        return &FDM.fds[fd];
    else
        return NULL;

}

/**
 * fclose cierra el fd.
 */
int fclose(fdType *fdPtr)
{
    if (fdPtr == NULL)
        return -1;

    FDM.cant--;
    fdPtr->open = FALSE;
}
